﻿namespace Sidvall.Net.Mime
{
    public static class MediaTypeManager
    {
        #region Public Members

        #region GetMediaType

        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")]
        public static MediaType? GetMediaType(string mediaTypeName)
        {
            if (string.IsNullOrWhiteSpace(mediaTypeName))
                return null;
            switch (mediaTypeName)
            {
                case Sidvall.Net.Mime.MediaTypeNames.ApplicationFormUrlEncoded:
                    return Sidvall.Net.Mime.MediaType.ApplicationFormUrlEncoded;
                case Sidvall.Net.Mime.MediaTypeNames.ApplicationJson:
                    return Sidvall.Net.Mime.MediaType.ApplicationJson;
                case Sidvall.Net.Mime.MediaTypeNames.ApplicationMicrosoftExcel:
                    return Sidvall.Net.Mime.MediaType.ApplicationMicrosoftExcel;
                case Sidvall.Net.Mime.MediaTypeNames.ApplicationMicrosoftPowerpoint:
                    return Sidvall.Net.Mime.MediaType.ApplicationMicrosoftPowerpoint;
                case Sidvall.Net.Mime.MediaTypeNames.ApplicationMicrosoftWord:
                    return Sidvall.Net.Mime.MediaType.ApplicationMicrosoftWord;
                case Sidvall.Net.Mime.MediaTypeNames.ApplicationOctetStream:
                    return Sidvall.Net.Mime.MediaType.ApplicationOctetStream;
                case Sidvall.Net.Mime.MediaTypeNames.ApplicationPdf:
                    return Sidvall.Net.Mime.MediaType.ApplicationPdf;
                case Sidvall.Net.Mime.MediaTypeNames.ApplicationXml:
                    return Sidvall.Net.Mime.MediaType.ApplicationXml;
                case Sidvall.Net.Mime.MediaTypeNames.ApplicationZip:
                    return Sidvall.Net.Mime.MediaType.ApplicationZip;

                case Sidvall.Net.Mime.MediaTypeNames.ImageBmp:
                    return Sidvall.Net.Mime.MediaType.ImageBmp;
                case Sidvall.Net.Mime.MediaTypeNames.ImageGif:
                    return Sidvall.Net.Mime.MediaType.ImageGif;
                case Sidvall.Net.Mime.MediaTypeNames.ImageJpeg:
                    return Sidvall.Net.Mime.MediaType.ImageJpeg;
                case Sidvall.Net.Mime.MediaTypeNames.ImagePng:
                    return Sidvall.Net.Mime.MediaType.ImagePng;

                case Sidvall.Net.Mime.MediaTypeNames.MultipartFormData:
                    return Sidvall.Net.Mime.MediaType.MultipartFormData;

                case Sidvall.Net.Mime.MediaTypeNames.TextHtml:
                    return Sidvall.Net.Mime.MediaType.TextHtml;
                case Sidvall.Net.Mime.MediaTypeNames.TextPlain:
                    return Sidvall.Net.Mime.MediaType.TextPlain;
                case Sidvall.Net.Mime.MediaTypeNames.TextXml:
                    return Sidvall.Net.Mime.MediaType.TextXml;
                default:
                    return null;
            }
        }

        #endregion
        #region GetMediaTypeName

        public static string GetMediaTypeName(MediaType mediaType)
        {
            switch (mediaType)
            {
                case MediaType.ApplicationFormUrlEncoded:
                    return Sidvall.Net.Mime.MediaTypeNames.ApplicationFormUrlEncoded;
                case MediaType.ApplicationJson:
                    return Sidvall.Net.Mime.MediaTypeNames.ApplicationJson;
                case MediaType.ApplicationMicrosoftExcel:
                    return Sidvall.Net.Mime.MediaTypeNames.ApplicationMicrosoftExcel;
                case MediaType.ApplicationMicrosoftPowerpoint:
                    return Sidvall.Net.Mime.MediaTypeNames.ApplicationMicrosoftPowerpoint;
                case MediaType.ApplicationMicrosoftWord:
                    return Sidvall.Net.Mime.MediaTypeNames.ApplicationMicrosoftWord;
                case MediaType.ApplicationOctetStream:
                    return Sidvall.Net.Mime.MediaTypeNames.ApplicationOctetStream;
                case MediaType.ApplicationPdf:
                    return Sidvall.Net.Mime.MediaTypeNames.ApplicationPdf;
                case MediaType.ApplicationXml:
                    return Sidvall.Net.Mime.MediaTypeNames.ApplicationXml;
                case MediaType.ApplicationZip:
                    return Sidvall.Net.Mime.MediaTypeNames.ApplicationZip;

                case MediaType.ImageBmp:
                    return Sidvall.Net.Mime.MediaTypeNames.ImageBmp;
                case MediaType.ImageGif:
                    return Sidvall.Net.Mime.MediaTypeNames.ImageGif;
                case MediaType.ImageJpeg:
                    return Sidvall.Net.Mime.MediaTypeNames.ImageJpeg;
                case MediaType.ImagePng:
                    return Sidvall.Net.Mime.MediaTypeNames.ImagePng;

                case MediaType.MultipartFormData:
                    return Sidvall.Net.Mime.MediaTypeNames.MultipartFormData;

                case MediaType.TextHtml:
                    return Sidvall.Net.Mime.MediaTypeNames.TextHtml;
                case MediaType.TextPlain:
                    return Sidvall.Net.Mime.MediaTypeNames.TextPlain;
                case MediaType.TextXml:
                    return Sidvall.Net.Mime.MediaTypeNames.TextXml;
                default:
                    throw new System.ArgumentOutOfRangeException(nameof(mediaType));
            }
        }

        #endregion
        #region GetMediaTypeNameFromFileExtension

        public static string GetMediaTypeNameFromFileExtension(string extension)
        {
            return GetMediaTypeNameFromFileExtension(extension, Sidvall.Net.Mime.MediaTypeNames.ApplicationOctetStream);
        }
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")]
        public static string GetMediaTypeNameFromFileExtension(string extension, string defaultMediaTypeName)
        {
            if (string.IsNullOrWhiteSpace(extension))
                return defaultMediaTypeName;
            extension = extension.Trim('.').ToUpperInvariant();
            switch (extension)
            {
                case "BIN":
                case "EXE":
                    return MediaTypeNames.ApplicationOctetStream;
                case "BMP":
                    return MediaTypeNames.ImageBmp;
                case "DOC":
                case "DOCX":
                case "DOT":
                    return MediaTypeNames.ApplicationMicrosoftWord;
                case "GIF":
                    return MediaTypeNames.ImageGif;
                case "HTM":
                case "HTML":
                    return MediaTypeNames.TextHtml;
                case "JPE":
                case "JPEG":
                case "JPG":
                    return MediaTypeNames.ImageJpeg;
                case "PDF":
                    return MediaTypeNames.ApplicationPdf;
                case "PNG":
                    return MediaTypeNames.ImagePng;
                case "PPT":
                case "PPTX":
                    return MediaTypeNames.ApplicationMicrosoftPowerpoint;
                case "TXT":
                    return MediaTypeNames.TextPlain;
                case "XLS":
                case "XLSX":
                case "XLT":
                    return MediaTypeNames.ApplicationMicrosoftExcel;
                case "ZIP":
                    return MediaTypeNames.ApplicationZip;
                default:
                    return defaultMediaTypeName;
            }
        }

        #endregion

        #endregion
    }
}
